package com.xing.crm.config;

import com.xing.crm.pojo.User;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xing.crm.pojo.WebUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author Mr.L
 * @version V1.0
 * 相关教程：https://blog.csdn.net/zhangpower1993/article/details/89016503
 * @date 2021年07月21日 17:37
 * 配置教程：https://blog.csdn.net/zhangpower1993/article/details/89016503
 */
@Configuration
public class MyWebConfig implements WebMvcConfigurer
{
	private Logger log = LoggerFactory.getLogger(getClass().getName());
	
	//静态资源映射
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry)
	{
		String imgPath = System.getProperty("user.dir") + "/upload/";
		registry.addResourceHandler("/static/upload/**").addResourceLocations("file:" + imgPath );
		registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:static/favicon.ico");
	}
	
	//路径拦截器
	@Override
	public void addInterceptors(InterceptorRegistry registry)
	{
		//排除
		List<String> excludePathLists = new ArrayList();
		excludePathLists.add("/");
		excludePathLists.add("/static/**");
		excludePathLists.add("/admin/login");//后台登录页面
		excludePathLists.add("/user/login");//后台登录接口
		excludePathLists.add("/web/login");//展示端登录页面
		excludePathLists.add("/web/user/login");//展示端登录接口
		
		//注册
		registry.addInterceptor(ConfigPathInterceptor()).excludePathPatterns(excludePathLists).addPathPatterns(new String[] { "/**", "/web/**"});
	}
	
	
	//以下用于实现拦截器的实例
	@Bean
	public ConfigPathInterceptor ConfigPathInterceptor()
	{
		return new ConfigPathInterceptor();
	}
	
	@Component
	class ConfigPathInterceptor implements HandlerInterceptor
	{
		ConfigPathInterceptor() {}
		
		@Override
		public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
				throws Exception
		{
			
			/**
			 * 注意，由于最开始
			 */
			User user = (User)request.getSession().getAttribute("user");//管理员
			WebUser webUser = (WebUser) request.getSession().getAttribute("webUser"); //普通用户
			String uri = request.getRequestURI();//返回除去host（域名或者ip）部分的路径
			String referer = request.getHeader("Referer"); //获取来路 https://www.cnblogs.com/jgig11/p/4164351.html
			
			if(uri.startsWith("/web/")) {//如果访问的是展示端，没有登录则跳转到登录页面
				if(webUser == null) {
					response.sendRedirect("/web/login");
				}
			} else {//如果访问不是展示端，则是管理端的
				System.out.println("访问非前台路径："+request.getRequestURI());
				//20210906 在2个登录接口增加了同一浏览器不能同时登录用户端和管理端，不知会不会和下面的登录判断起冲突 ？
				//如果是web用户，并且请求地址以list或get结尾（使用后台接口？）
				if(webUser != null && (uri.endsWith("/list") || uri.endsWith("/get"))) {
					if(referer == null) {//如果来路是空，应该是指ajax请求
						//他妈妈的太多if ,老子看不懂了
						if(user == null) {//如果不是后台用户（或没登录）
							response.sendRedirect("/admin/login");
						} else {
							response.sendRedirect("/admin/index");
						}
					}
				} else if(user == null && (referer == null || !referer.contains("/web"))) {
					response.sendRedirect("/admin/login");
				}
			}
			return true;
		}
	}
	
}
